﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using INSTA.BankApplication.Engine;

// pour le framework NUnit.
using NUnit.Framework;

namespace INSTA.BankApplication.Engine.Tests
{
    /// <summary>
    /// L'attribut [TestFixture] indique au framework
    /// NUnit que cette classe contient des tests 
    /// unitaires à faire tourner.
    /// /// </summary>
    [TestFixture]
    public class Test_Person
    {
        Person _p;

        /// <summary>
        /// L'attribut [SetUp] de NUnit indique que la méthode 
        /// (qui doit elle aussi être nommée "SetUp"), va être
        /// exécutée AVANT chaque méthode décorée avec l'attribut [Test]
        /// </summary>
        [SetUp]
        public void SetUp()
        {
            _p = new Person();
        }

        /// <summary>
        /// L'attribut [TearDown] de NUnit indique que la méthode 
        /// (qui doit elle aussi être nommée "TearDown"), va être
        /// exécutée APRES chaque méthode décorée avec l'attribut [Test]
        /// </summary>
        [TearDown]
        public void TearDown()
        {
            _p = null;
        }


        [Test]
        public void Test_Constructor_OneParameters()
        {
            Person p = new Person("aa");

            Assert.IsTrue(p.Name == "AA");

        }



        [Test]
        public void Test_Constructor_TwoParameters()
        {
            Person p = new Person("aa", "bb");

            bool result = p.Name == "AA";
            result = result && p.FirstName == "bb";

            Assert.IsTrue(result);

        }



        /// <summary>
        /// L'attribut [Test] décorant cette méthode indique
        /// au framework NUnit que cette méthode 
        /// représente un test à faire tourner.
        /// </summary>
        [Test]
        public void Test_Property_Name()
        {

            _p.Name = "aa";

            // Appel d'une méthode de la classe Assert de NUnit.
            // Les méthodes de la classes Assert renvoient toujours un 
            // bool qui indiquera le succès ou l'échec du test.
            Assert.IsTrue(_p.Name == "aa".ToUpper());

        }

        [Test]
        public void Test_Property_FirstName_CorrectLength()
        {

            _p.FirstName = "aa";

            // Appel d'une méthode de la classe Assert de NUnit.
            // Les méthodes de la classes Assert renvoient toujours un 
            // bool qui indiquera le succès ou l'échec du test.
            Assert.IsTrue(_p.FirstName == "aa");
        }

        [Test]
        public void Test_Property_FirstName_OverTenChars()
        {

            _p.FirstName = "aaaaaaaaaaaaaaaaaaa";

            // Appel d'une méthode de la classe Assert de NUnit.
            // Les méthodes de la classes Assert renvoient toujours un 
            // bool qui indiquera le succès ou l'échec du test.
            Assert.IsTrue(_p.FirstName == "aaaaaaaaaa");
        }

        [Test]
        public void Test_Property_FirstName_EmptyString()
        {

            _p.FirstName = "";

            // Appel d'une méthode de la classe Assert de NUnit.
            // Les méthodes de la classes Assert renvoient toujours un 
            // bool qui indiquera le succès ou l'échec du test.
            Assert.IsTrue(_p.FirstName == "");
        }

        [Test]
        public void Test_Property_YearOfBirth_ForCorrectValue()
        {

            _p.YearOfBirth = DateTime.Now.Year - 1;

            // Appel d'une méthode de la classe Assert de NUnit.
            // Les méthodes de la classes Assert renvoient toujours un 
            // bool qui indiquera le succès ou l'échec du test.
            Assert.IsTrue(_p.YearOfBirth == DateTime.Now.Year - 1);
        }

        [Test]
        public void Test_Property_YearOfBirth_ForUnderMin()
        {

            _p.YearOfBirth = DateTime.Now.Year - 101;

            // Appel d'une méthode de la classe Assert de NUnit.
            // Les méthodes de la classes Assert renvoient toujours un 
            // bool qui indiquera le succès ou l'échec du test.
            Assert.IsTrue(_p.YearOfBirth == -1);
        }

        [Test]
        public void Test_Property_YearOfBirth_ForOverMax()
        {

            _p.YearOfBirth = DateTime.Now.Year + 1;

            Assert.IsTrue(_p.YearOfBirth == -1);
        }


        [Test]
        public void Test_Property_Age_ForIncorrectYearOfBirth()
        {

            _p.YearOfBirth = DateTime.Now.Year + 1;

            Assert.IsTrue(_p.Age == -1);
        }

        [Test]
        public void Test_Property_Age_ForCorrectYearOfBirth()
        {

            _p.YearOfBirth = DateTime.Now.Year - 1;

            Assert.IsTrue(_p.Age == 1);
        }


    }
}
